﻿using System.Linq.Expressions;
using wwl.Contract.Dtos.Common;       // 包含分页请求/结果等通用数据传输对象
using wwl.Contract.Interfaces.Common; // 包含通用仓储接口定义
using wwl.Domain.Entities.Common;     // 包含基础实体类定义

namespace wwl.DataAccess.Repositories.Common
{
  /// <summary>
  /// 泛型仓储实现类，提供基础的CRUD及查询功能
  /// 实现了IRepository<T>接口，约束T必须继承自BaseEntity（基础实体类）
  /// </summary>
  /// <typeparam name="T">实体类型，必须继承自BaseEntity</typeparam>
  public class GenericRepository<T> : IGenericRepository<T> where T : BaseEntity
  {
    /// <summary>
    /// 数据访问包装器，封装了具体的数据操作实现
    /// </summary>
    protected readonly IEfWrapper _wrapper;

    /// <summary>
    /// 构造函数，注入数据访问包装器
    /// </summary>
    /// <param name="wrapper">数据访问包装器实例</param>
    public GenericRepository(IEfWrapper wrapper)
    {
      _wrapper = wrapper;
    }

    /// <summary>
    /// 根据ID异步获取实体
    /// </summary>
    /// <param name="id">实体ID</param>
    /// <returns>找到的实体，若不存在则返回null</returns>
    public virtual async Task<T?> GetByIdAsync(string id)
    {
      return await _wrapper.GetByIdAsync<T>(id);
    }

    /// <summary>
    /// 异步添加新实体
    /// </summary>
    /// <param name="entity">要添加的实体</param>
    /// <returns>添加后的实体（通常包含自动生成的ID等信息）</returns>
    public virtual async Task<T> AddAsync(T entity)
    {
      return await _wrapper.AddAsync(entity);
    }

    /// <summary>
    /// 异步更新实体
    /// </summary>
    /// <param name="entity">要更新的实体</param>
    /// <returns>更新后的实体</returns>
    public virtual async Task<T> UpdateAsync(T entity)
    {
      return await _wrapper.UpdateAsync(entity);
    }

    /// <summary>
    /// 异步删除指定ID的实体（物理删除）
    /// </summary>
    /// <param name="id">实体ID</param>
    /// <returns>删除成功返回true，否则返回false</returns>
    public virtual async Task<bool> DeleteAsync(string id)
    {
      return await _wrapper.DeleteAsync<T>(id);
    }

    /// <summary>
    /// 异步软删除指定ID的实体（逻辑删除，通常通过标记IsDeleted等字段实现）
    /// </summary>
    /// <param name="id">实体ID</param>
    /// <returns>软删除成功返回true，否则返回false</returns>
    public virtual async Task<bool> SoftDeleteAsync(string id)
    {
      return await _wrapper.SoftDeleteAsync<T>(id);
    }

    /// <summary>
    /// 获取实体的查询对象（带跟踪，适用于需要更新的查询）
    /// </summary>
    /// <returns>IQueryable<T>查询对象</returns>
    public virtual IQueryable<T> Query()
    {
      return _wrapper.Query<T>();
    }

    /// <summary>
    /// 获取实体的查询对象（不带跟踪，适用于只读查询，性能更优）
    /// </summary>
    /// <returns>IQueryable<T>查询对象</returns>
    public virtual IQueryable<T> QueryNoTracking()
    {
      return _wrapper.QueryNoTracking<T>();
    }

    /// <summary>
    /// 异步获取分页结果
    /// </summary>
    /// <param name="request">分页请求参数（包含页码、页大小等）</param>
    /// <param name="filter">可选的查询条件表达式</param>
    /// <returns>分页结果对象，包含当前页数据及总记录数等信息</returns>
    public virtual async Task<PagedResult<T>> GetPagedAsync(PagedRequest request,
        Expression<Func<T, bool>>? filter = null)
    {
      return await _wrapper.GetPagedAsync(request, filter);
    }
  }
}